home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / itemf1.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  19KB  |  979 lines

  1. /* omega copyright (C) 1987,1988,1989 by Laurence Raphael Brothers */
  2. /* itemf1.c */
  3.  
  4. /* various item functions: potions,scrolls,boots,cloaks,things,food */
  5.  
  6. #include "glob.h"
  7.  
  8.  
  9. /* general item functions */
  10.  
  11. void i_no_op(o)
  12. pob o;
  13. {
  14. }
  15.  
  16. void i_nothing(o)
  17. pob o;
  18. {
  19. }
  20.  
  21.  
  22.  
  23.  
  24.  
  25. /*  scroll functions */
  26.  
  27. void i_knowledge(o)
  28. pob o;
  29. {
  30.   if (o->blessing > -1)
  31.     Objects[o->id].known = 1;
  32.   knowledge(o->blessing);
  33. }
  34.  
  35. void i_jane_t(o)
  36. pob o;
  37. {
  38.   int volume = random_range(6);
  39.   int i,j,k;
  40.   char v;
  41.  
  42.   print1("Jane's Guide to the World's Treasures: ");
  43.   
  44.   switch(volume) {
  45.     case 0:nprint1("SCROLLS");j = SCROLLID; k = POTIONID; break;
  46.     case 1:nprint1("POTIONS");j = POTIONID; k = WEAPONID; break;
  47.     case 2:nprint1("CLOAKS");j = CLOAKID; k = BOOTID; break;
  48.     case 3:nprint1("BOOTS");j = BOOTID; k = RINGID; break;
  49.     case 4:nprint1("RINGS");j = RINGID; k = STICKID; break;
  50.     case 5:nprint1("STICKS");j = STICKID; k = ARTIFACTID; break;
  51.   }
  52.   menuclear();
  53.   menuprint("You could probably now recognise:\n");
  54.   for(i=j;i<k;i++) {
  55.     Objects[i].known = 1;
  56.     v = Objects[i].truename[0];
  57.     if ((v >= 'A' && v <= 'Z') || volume == 3)
  58.       sprintf(Str1, "   %s\n", Objects[i].truename);
  59.     else if (v == 'a' || v == 'e' || v == 'i' || v == 'o' || v == 'u')
  60.       sprintf(Str1, "   an %s\n", Objects[i].truename);
  61.     else
  62.       sprintf(Str1, "   a %s\n", Objects[i].truename);
  63.     menuprint(Str1);
  64.   }
  65.   showmenu();
  66.   morewait();
  67.   xredraw();
  68. }
  69.  
  70.    
  71. void i_flux(o)
  72. pob o;
  73. {
  74.   if (o->blessing > -1)
  75.     Objects[o->id].known = 1;
  76.   flux(o->blessing);
  77. }
  78.  
  79.  
  80. /* enchantment */
  81. void i_enchant(o)
  82. pob o;
  83. {
  84.   if (o->blessing > -1)
  85.     Objects[o->id].known = 1;
  86.   enchant(o->blessing < 0 ? -1-o->plus : o->plus+1);
  87. }
  88.  
  89. /* scroll of clairvoyance */
  90. void i_clairvoyance(o)
  91. struct object *o;
  92. {
  93.   if (o->blessing > -1)
  94.     Objects[o->id].known = 1;
  95.   if (o->blessing < 0)
  96.     amnesia();
  97.   else clairvoyance(5+o->blessing*5);
  98. }
  99.  
  100.  
  101.  
  102. void i_acquire(o)
  103. pob o;
  104. {
  105.   int blessing;
  106.  
  107.   if (o->blessing > -1)
  108.     Objects[o->id].known = 1;
  109.   blessing = o->blessing;
  110.   *o = Objects[SCROLLID+0]; /* blank out the scroll */
  111.   acquire(blessing);
  112. }
  113.  
  114. void i_teleport(o)
  115. pob o;
  116. {
  117.   if (o->blessing > -1)
  118.     Objects[o->id].known = 1;
  119.   p_teleport(o->blessing);
  120. }
  121.  
  122.  
  123. void i_spells(o)
  124. pob o;
  125. {
  126.   if (o->blessing > -1)
  127.     Objects[o->id].known = 1;
  128.   mprint("A scroll of spells.");
  129.   morewait();
  130.   learnspell(o->blessing);
  131. }
  132.  
  133.  
  134.  
  135. /* scroll of blessing */
  136. void i_bless(o)
  137. pob o;
  138. {
  139.   Objects[o->id].known = 1;
  140.   bless(o->blessing);
  141. }
  142.  
  143. /* scroll of wishing */
  144. void i_wish(o)
  145. pob o;
  146. {
  147.   if (o->blessing > -1)
  148.     Objects[o->id].known = 1;
  149.   wish(o->blessing);
  150.   *o = Objects[SCROLLID+0]; /* blank out the scroll */
  151. }
  152.  
  153. /* scroll of displacement */
  154. void i_displace(o)
  155. pob o;
  156. {
  157.   if (o->blessing > -1) 
  158.       Objects[o->id].known = 1;
  159.   displace(o->blessing);
  160. }
  161.  
  162.  
  163. /* scroll of deflection */
  164. void i_deflect(o)
  165. pob o;
  166. {
  167.   if (o->blessing > -1) 
  168.     Objects[o->id].known = 1;
  169.   deflection(o->blessing);
  170. }
  171.  
  172. /* scroll of identification */
  173. void i_id(o)
  174. pob o;
  175. {
  176.   if (o->blessing > -1)
  177.     Objects[o->id].known = 1;
  178.   identify(o->blessing);
  179. }
  180.  
  181. /* potion functions */
  182.  
  183. /* potion of healing */
  184. void i_heal(o)
  185. pob o;
  186. {
  187.   if (o->blessing > -1) {
  188.     Objects[o->id].known = 1;
  189.     heal(1+o->plus);
  190.   }
  191.   else heal(-1-abs(o->plus));
  192. }
  193.  
  194. /* potion of monster detection */
  195. void i_mondet(o)
  196. pob o;
  197. {
  198.   if (o->blessing > -1)
  199.     Objects[o->id].known = 1;
  200.   mondet(o->blessing);
  201. }
  202.  
  203.  
  204. /* potion of object detection */
  205. void i_objdet(o)
  206. pob o;
  207. {
  208.  
  209.   if (o->blessing > -1)
  210.     Objects[o->id].known = 1;
  211.   objdet(o->blessing);
  212. }
  213.  
  214. /* potion of neutralize poison */
  215. void i_neutralize_poison(o)
  216. pob o;
  217. {
  218.   if (o->blessing > -1) {
  219.     Objects[o->id].known = 1;
  220.     mprint("You feel vital!");
  221.     Player.status[POISONED] = 0;
  222.   }
  223.   else p_poison(random_range(20)+5);
  224. }
  225.  
  226.  
  227. /* potion of sleep */
  228. void i_sleep_self(o)
  229. pob o;
  230. {
  231.   sleep_player(6);
  232.   Objects[o->id].known = 1;
  233. }
  234.  
  235.  
  236.  
  237.  
  238. /* potion of speed */
  239. void i_speed(o)
  240. pob o;
  241. {
  242.   if (o->blessing > -1) 
  243.     Objects[o->id].known = 1;
  244.   haste(o->blessing);
  245. }
  246.  
  247.  
  248. /* potion of restoration */
  249. void i_restore(o)
  250. pob o;
  251. {
  252.   if (o->blessing > -1) 
  253.     Objects[o->id].known = 1;
  254.   recover_stat(o->blessing);
  255. }
  256.  
  257. void i_augment(o)
  258. pob o;
  259. {
  260.   if (o->blessing > -1) 
  261.     Objects[o->id].known = 1;
  262.   augment(o->blessing);
  263. }  
  264.  
  265. void i_azoth(o)
  266. pob o;
  267. {
  268.   if (o->plus < 0) {
  269.     mprint("The mercury was poisonous!");
  270.     p_poison(25);
  271.   }
  272.   else if (o->plus == 0) {
  273.     mprint("The partially enchanted azoth makes you sick!");
  274.     Player.con = ((int) (Player.con / 2));
  275.     calc_melee();
  276.   }
  277.   else if (o->blessing < 1) {
  278.     mprint("The unblessed azoth warps your soul!");
  279.     Player.pow = Player.maxpow = ((int) (Player.maxpow / 2));
  280.     level_drain(random_range(10),"cursed azoth");
  281.   }
  282.   else {
  283.     mprint("The azoth fills you with cosmic power!");
  284.     if (Player.str > Player.maxstr*2) {
  285.       mprint("The power rages out of control!");
  286.       p_death("overdose of azoth");
  287.     }
  288.     else {
  289.       heal(10);
  290.       cleanse(1);
  291.       Player.mana = calcmana()*3;
  292.       Player.str = (Player.maxstr++)*3;
  293.     }
  294.   }
  295. }
  296.  
  297. void i_regenerate(o)
  298. pob o;
  299. {
  300.   regenerate(o->blessing);
  301. }
  302.  
  303.  
  304.  
  305.  
  306.  
  307. /* boots functions */
  308. void i_perm_speed(o)
  309. pob o;
  310. {
  311.   if (o->blessing > -1) {
  312.     if (o->used) {
  313.       o->known = 2;
  314.       Objects[o->id].known = 1;
  315.       if (Player.status[SLOWED] > 0) {
  316.     Player.status[SLOWED] = 0;
  317.       }
  318.       mprint("The world slows down!"); 
  319.       Player.status[HASTED] += 1500;
  320.     }
  321.     else {
  322.       Player.status[HASTED] -= 1500;
  323.       if (Player.status[HASTED] < 1) 
  324.     mprint("The world speeds up again.");
  325.     }
  326.   }
  327.   else {
  328.     if (o->used) {
  329.       if (Player.status[HASTED] > 0) {
  330.     Player.status[HASTED] = 0;
  331.       }
  332.       mprint("You feel slower.");
  333.       Player.status[SLOWED] += 1500;
  334.     }
  335.     else  {
  336.       Player.status[SLOWED] -= 1500;
  337.       if (Player.status[SLOWED] < 1) 
  338.     mprint("You feel quicker again.");
  339.     }  
  340.   }
  341. }
  342.  
  343. /* cloak functions */
  344. void i_perm_displace(o)
  345. pob o;
  346. {
  347.   if (o->blessing > -1) {
  348.     if (o->used) {
  349.       mprint("You feel dislocated.");
  350.       Player.status[DISPLACED] += 1500;
  351.     }
  352.     else {
  353.       Player.status[DISPLACED] -= 1500;
  354.       if (Player.status[DISPLACED] < 1) {
  355.     mprint("You feel a sense of position.");
  356.     Player.status[DISPLACED] = 0;
  357.       }
  358.     }
  359.   }
  360.   else {
  361.     if (o->used) {
  362.       mprint("You have a forboding of bodily harm!");
  363.       Player.status[VULNERABLE] += 1500;
  364.     }
  365.     else {
  366.       Player.status[VULNERABLE] -= 1500;
  367.       if (Player.status[VULNERABLE] < 1) {
  368.     mprint("You feel less endangered.");
  369.     Player.status[VULNERABLE] = 0;
  370.       }
  371.     }
  372.   }
  373. }
  374.  
  375. void i_perm_negimmune(o)
  376. pob o;
  377. {
  378.   if (o->blessing > -1) {
  379.     if (o->used) {
  380.       Player.immunity[NEGENERGY]++;
  381.     }
  382.     else Player.immunity[NEGENERGY]--;
  383.   }
  384.   else if (o->used)
  385.     level_drain(abs(o->blessing),"cursed cloak of level drain");
  386. }
  387.  
  388. /* food functions */
  389.  
  390.  
  391. void i_food(o)
  392. pob o;
  393. {
  394.   switch(random_range(5)) {
  395.     case 0: mprint("That tasted horrible!"); break;
  396.     case 1: mprint("Yum!"); break;
  397.     case 2: mprint("How nauseous!"); break;
  398.     case 3: mprint("Can I have some more? Please?"); break;
  399.     case 4: mprint("Your mouth feels like it is growing hair!"); break;
  400.   }
  401. }
  402.  
  403. void i_stim(o)
  404. pob o;
  405. {
  406.   mprint("You feel Hyper!");
  407.   i_speed(o);
  408.   Player.str +=3;
  409.   Player.con -=1;
  410.   calc_melee();
  411. }
  412.  
  413. void i_pow(o)
  414. pob o;
  415. {
  416.   mprint("You feel a surge of mystic power!");
  417.   Player.mana = 2 * calcmana();
  418. }
  419.  
  420. void i_poison_food(o)
  421. pob o;
  422. {
  423.   mprint("This food was contaminated with cyanide!");
  424.   p_poison(random_range(20)+5);
  425. }
  426.  
  427. void i_pepper_food(o)
  428. pob o;
  429. {
  430.   mprint("You innocently start to chew the szechuan pepper.....");
  431.   morewait();
  432.   mprint("hot.");
  433.   morewait();
  434.   mprint("Hot.");
  435.   morewait();
  436.   mprint("Hot!");
  437.   morewait();
  438.   mprint("HOT!!!!!!");
  439.   morewait();
  440.   p_damage(1,UNSTOPPABLE,"a szechuan pepper");
  441.   mprint("Your sinuses melt and run out your ears.");
  442.   mprint("Your mouth and throat seem to be permanently on fire.");
  443.   mprint("You feel much more awake now....");
  444.   Player.immunity[SLEEP]++;
  445. }
  446.  
  447. void i_lembas(o)
  448. pob o;
  449. {
  450.   heal(10);
  451.   cleanse(0);
  452.   Player.food = 40;
  453. }
  454.  
  455.  
  456. void i_cure(o)
  457. pob o;
  458. {
  459.   cure(o->blessing);
  460. }
  461.  
  462. void i_immune(o)
  463. pob o;
  464. {
  465.   if (o->blessing > 0) {
  466.     mprint("You feel a sense of innoculation");
  467.     Player.immunity[INFECTION]++;
  468.     cure(o->blessing);
  469.   }
  470. }
  471.  
  472.  
  473.  
  474. void i_breathing(o)
  475. pob o;
  476. {
  477.   
  478.   if (o->blessing > -1)
  479.     Objects[o->id].known = 1;
  480.   breathe(o->blessing);
  481. }
  482.  
  483.       
  484. void i_invisible(o)
  485. pob o;
  486. {
  487.   if (o->blessing > -1)
  488.     Objects[o->id].known = 1;
  489.   invisible(o->blessing);
  490. }
  491.  
  492.  
  493. void i_perm_invisible(o)
  494. pob o;
  495. {
  496.   if (o->blessing > -1)
  497.     Objects[o->id].known = 1;
  498.   if (o->used) {
  499.     if (o->blessing > -1) {
  500.       mprint("You feel transparent!");
  501.       Player.status[INVISIBLE] += 1500;
  502.     }
  503.     else {
  504.       mprint("You feel a forboding of bodily harm!");
  505.       Player.status[VULNERABLE] += 1500;
  506.     }
  507.   }
  508.   else {
  509.     if (o->blessing > -1) {
  510.       Player.status[INVISIBLE]-=1500;
  511.       if (Player.status[INVISIBLE] < 1) {
  512.     mprint("You feel opaque again.");
  513.     Player.status[INVISIBLE] = 0;
  514.       }
  515.     }
  516.     else {
  517.       Player.status[VULNERABLE] -= 1500;
  518.       if (Player.status[VULNERABLE] < 1) {
  519.     mprint("You feel less endangered now.");
  520.     Player.status[VULNERABLE] = 0;
  521.       }
  522.     }
  523.   }
  524. }
  525.  
  526.  
  527. void i_warp(o)
  528. pob o;
  529. {
  530.   if (o->blessing > -1)
  531.     Objects[o->id].known = 1;
  532.   warp(o->blessing);
  533. }
  534.  
  535.  
  536. void i_alert(o)
  537. pob o;
  538. {
  539.   if (o->blessing > -1) {
  540.     Objects[o->id].known = 1;
  541.     alert(o->blessing);
  542.   }
  543. }
  544.  
  545. void i_charge(o)
  546. pob o;
  547. {
  548.   int i;
  549.   if (o->blessing > -1)
  550.     Objects[o->id].known = 1;
  551.   mprint("A scroll of charging.");
  552.   mprint("Charge: ");
  553.   i = getitem(STICK);
  554.   if (i != ABORT) {
  555.     if (o->blessing < 0) {
  556.       mprint("The stick glows black!");
  557.       Player.possessions[i]->charge = 0;
  558.     }
  559.     else {
  560.       mprint("The stick glows blue!");
  561.       Player.possessions[i]->charge += (random_range(10)+1)*(o->blessing+1);
  562.       if (Player.possessions[i]->charge > 99)
  563.     Player.possessions[i]->charge = 99;
  564.     }
  565.   }
  566. }
  567.  
  568.  
  569. void i_fear_resist(o)
  570. pob o;
  571. {
  572.   if (o->blessing > -1) {
  573.     Objects[o->id].known = 1;
  574.     if (Player.status[AFRAID] > 0) {
  575.       mprint("You feel stauncher now.");
  576.       Player.status[AFRAID] = 0;
  577.     }
  578.   }
  579.   else if (! p_immune(FEAR)) {
  580.     mprint("You panic!");
  581.     Player.status[AFRAID]+=random_range(100);
  582.   }
  583. }
  584.  
  585.  
  586.  
  587. /* use a thieves pick */
  588. void i_pick(o)
  589. pob o;
  590. {
  591.   int dir;
  592.   int ox,oy;
  593.   o->used = FALSE;
  594.   if ((! o->known) && (! Player.rank[THIEVES]))
  595.     mprint("You have no idea what do with a piece of twisted metal.");
  596.   else {
  597.     o->known = 1;
  598.     Objects[o->id].known = 1;
  599.     mprint("Pick lock:");
  600.     dir = getdir();
  601.     if (dir == ABORT)
  602.       resetgamestatus(SKIP_MONSTERS);
  603.     else {
  604.       ox = Player.x + Dirs[0][dir];
  605.       oy = Player.y + Dirs[1][dir];
  606.       if ((Level->site[ox][oy].locchar != CLOSED_DOOR) || 
  607.       loc_statusp(ox,oy,SECRET)) {
  608.     mprint("You can't unlock that!");
  609.     resetgamestatus(SKIP_MONSTERS);
  610.       }
  611.       else if (Level->site[ox][oy].aux == LOCKED) {
  612.     if (Level->depth == MaxDungeonLevels-1) 
  613.       mprint("The lock is too complicated for you!!!");
  614.     else if (Level->depth*2 + random_range(50) <
  615.         Player.dex+Player.level+Player.rank[THIEVES]*10) {
  616.       mprint("You picked the lock!");
  617.       Level->site[ox][oy].aux = UNLOCKED;
  618.       lset(ox, oy, CHANGED);
  619.       gain_experience(max(3,Level->depth));
  620.     }
  621.     else mprint("You failed to pick the lock.");
  622.       }
  623.       else mprint("That door is already unlocked!");
  624.     }
  625.   }
  626. }
  627.  
  628. /* use a magic key*/
  629. void i_key(o)
  630. pob o;
  631. {
  632.   int dir;
  633.   int ox,oy;
  634.   o->used = FALSE;
  635.   mprint("Unlock door: ");
  636.   dir = getdir();
  637.   if (dir == ABORT)
  638.     resetgamestatus(SKIP_MONSTERS);
  639.   else {
  640.     ox = Player.x + Dirs[0][dir];
  641.     oy = Player.y + Dirs[1][dir];
  642.     if ((Level->site[ox][oy].locchar != CLOSED_DOOR) || 
  643.     loc_statusp(ox,oy,SECRET)) {
  644.       mprint("You can't unlock that!");
  645.       resetgamestatus(SKIP_MONSTERS);
  646.     }
  647.     else if (Level->site[ox][oy].aux == LOCKED) {
  648.     mprint("The lock clicks open!");
  649.     Level->site[ox][oy].aux = UNLOCKED;
  650.     lset(ox, oy, CHANGED);
  651.     o->blessing--;
  652.     if ((o->blessing<0)||(Level->depth == MaxDungeonLevels-1)) {
  653.       mprint("The key disintegrates!");
  654.       conform_lost_objects(1,o);
  655.     }
  656.     else
  657.       mprint("Your key glows faintly.");
  658.       }
  659.     else mprint("That door is already unlocked!");
  660.   }
  661. }
  662.  
  663. void i_corpse(o)
  664. pob o;
  665. {
  666.   switch (o->aux) {
  667.   case ML0+1: 
  668.   case ML0+2:
  669.   case ML0+3:
  670.   case ML0+4:
  671.   case ML2+0:
  672.   case ML2+2:
  673.   case ML7+3:
  674.   case ML10+0: /* cannibalism */
  675.     mprint("Yechh! How could you! You didn't even cook him, first!");
  676.     if (Player.alignment > 0) Player.food = 25;
  677.     Player.food += 8;
  678.     Player.alignment -=10;
  679.     foodcheck();
  680.     break;
  681.   case ML1+2: /* fnord */
  682.     mprint("You feel illuminated!");
  683.     Player.iq++;
  684.     break;
  685.   case ML4+3: /* denebian slime devil */
  686.     mprint("I don't believe this. You ate Denebian Slime?");
  687.     mprint("You deserve a horrible wasting death, uncurable by any means!");
  688.     break;
  689.   case ML5+0:
  690.     mprint("Those dragon-steaks were fantastic!");
  691.     Player.food=24;
  692.     foodcheck();
  693.     break;
  694.   case ML7+0:
  695.     mprint("You feel infinitely more virile now.");
  696.     Player.str = max(Player.str,Player.maxstr+10);
  697.     Player.food = 24;
  698.     foodcheck();
  699.     break;
  700.   case ML9+1:
  701.     mprint("Guess what? You're invisible.");
  702.     if (Player.status[INVISIBLE] < 1000) Player.status[INVISIBLE] = 666;
  703.     Player.food+=6;
  704.     foodcheck();
  705.     break;
  706.   case ML7+2:  
  707.     mprint("You ATE a unicorn's horn?!?!?");
  708.     Player.immunity[POISON]=1000;
  709.     break;
  710.   case ML0+0:
  711.   case ML1+0:
  712.   case ML1+1:
  713.   case ML1+4:
  714.   case ML1+5:
  715.   case ML1+6:
  716.   case ML1+10:
  717.   case ML2+1:
  718.   case ML2+4:
  719.   case ML4+1:
  720.   case ML4+4:
  721.   case ML5+3:
  722.     mprint("Well, you forced it down. Not much nutrition, though.");
  723.     Player.food++;
  724.     foodcheck();
  725.     break;
  726.   case ML1+3:
  727.   case ML1+7:
  728.   case ML2+3:
  729.   case ML2+5:
  730.   case ML3+1:
  731.   case ML4+5:
  732.   case ML9+3:
  733.   case ML10+1:
  734.     mprint("Oh, yuck. The 'food' seems to be tainted.");
  735.     mprint("You feel very sick. You throw up.");
  736.     Player.food = min(Player.food, 4);
  737.     if (! Player.immunity[INFECTION])
  738.       Player.status[DISEASED]+=24;
  739.     p_poison(10);
  740.     break;
  741.   default: mprint("It proved completely inedible, but you tried anyhow.");
  742.   }
  743. }
  744.  
  745. void i_accuracy(o)
  746. pob o;
  747. {
  748.   o->known = 1;
  749.   Objects[o->id].known = 1;
  750.   accuracy(o->blessing);
  751. }
  752.  
  753. void i_perm_accuracy(o)
  754. pob o;
  755. {
  756.   o->known = 1;
  757.   Objects[o->id].known = 1;
  758.   if ((o->used) && (o->blessing > -1)) {
  759.     Player.status[ACCURATE] += 1500;
  760.     mprint("You feel skillful and see bulls' eyes everywhere.");
  761.   }
  762.   else {
  763.     Player.status[ACCURATE] -= 1500;
  764.     if (Player.status[ACCURATE] < 1) {
  765.       Player.status[ACCURATE] = 0;
  766.       calc_melee();
  767.       mprint("Your vision blurs....");
  768.     }
  769.   }
  770. }
  771.  
  772. void i_hero(o)
  773. pob o;
  774. {
  775.   o->known = 1;
  776.   Objects[o->id].known = 1;
  777.   hero(o->blessing);
  778. }
  779.  
  780. void i_perm_hero(o)
  781. pob o;
  782. {
  783.   o->known = 1;
  784.   Objects[o->id].known = 1;
  785.   if (o->used){
  786.     if (o->blessing > -1) {
  787.       Player.status[HERO] += 1500;
  788.       calc_melee();
  789.       mprint("You feel super!");
  790.     }
  791.     else {
  792.       Player.status[HERO] = 0;
  793.       calc_melee();
  794.       if (! Player.immunity[FEAR]) {
  795.     Player.status[AFRAID]+=1500;
  796.     mprint("You feel cowardly....");
  797.       }
  798.     }
  799.   }
  800.   else {
  801.     if (o->blessing > -1) {
  802.       Player.status[HERO] -= 1500;
  803.       if (Player.status[HERO] < 1) {
  804.     calc_melee();
  805.     mprint("You feel less super now.");
  806.     Player.status[HERO] = 0;
  807.       }
  808.     }
  809.     else {
  810.       Player.status[AFRAID] -= 1500;
  811.       if (Player.status[AFRAID] < 1) {
  812.     mprint("You finally conquer your fear.");
  813.     Player.status[AFRAID] = 0;
  814.       }
  815.     }
  816.   } 
  817. }
  818.  
  819. void i_levitate(o)
  820. pob o;
  821. {
  822.   o->known = 1;
  823.   Objects[o->id].known = 1;
  824.   levitate(o->blessing);
  825. }
  826.  
  827. void i_perm_levitate(o)
  828. pob o;
  829. {
  830.   o->known = 1;
  831.   Objects[o->id].known = 1;
  832.   if (o->blessing > -1) {
  833.     if (o->used) {
  834.       Player.status[LEVITATING] += 1400;
  835.       mprint("You start to float a few inches above the floor");
  836.       mprint("You find you can easily control your altitude");
  837.     }
  838.     else {
  839.       Player.status[LEVITATING] -= 1500;
  840.       if (Player.status[LEVITATING] < 1) {
  841.     Player.status[LEVITATING] = 0;
  842.     mprint("You sink to the floor.");
  843.       }
  844.     }
  845.   }
  846.   else i_perm_burden(o);
  847. }
  848.  
  849. void i_perm_protection(o)
  850. pob o;
  851. {
  852.   if (o->used){
  853.     if (o->blessing > -1)
  854.       Player.status[PROTECTION] += abs(o->plus)+1;
  855.     else
  856.       Player.status[PROTECTION] -= abs(o->plus)+1;
  857.   }
  858.   else {
  859.     if (o->blessing > -1)
  860.       Player.status[PROTECTION] -= abs(o->plus)+1;
  861.     else
  862.       Player.status[PROTECTION] += abs(o->plus)+1;
  863.   }
  864.   calc_melee();
  865. }
  866.  
  867. void i_perm_agility(o)
  868. pob o;
  869. {
  870.   o->known = 2;
  871.   Objects[o->id].known = 1;
  872.   if (o->used){
  873.     if (o->blessing > -1)
  874.       Player.agi += abs(o->plus)+1;
  875.     else
  876.       Player.agi -= abs(o->plus)+1;
  877.   }
  878.   else {
  879.     if (o->blessing > -1)
  880.       Player.agi -= abs(o->plus)+1;
  881.     else
  882.       Player.agi += abs(o->plus)+1;
  883.   }
  884.   calc_melee();
  885. }
  886.  
  887. void i_truesight(o)
  888. pob o;
  889. {
  890.   o->known = 1;
  891.   Objects[o->id].known = 1;
  892.   truesight(o->blessing);
  893. }
  894.  
  895. void i_perm_truesight(o)
  896. pob o;
  897. {
  898.   o->known = 1;
  899.   Objects[o->id].known = 1;
  900.   if (o->used){
  901.     if (o->blessing > -1) {
  902.       Player.status[TRUESIGHT] += 1500;
  903.       mprint("You feel sharp!");
  904.     }
  905.     else {
  906.       Player.status[BLINDED] += 1500;
  907.       mprint("You've been blinded!");
  908.     }
  909.   }
  910.   else {
  911.     if (o->blessing > -1) {
  912.       Player.status[TRUESIGHT] -= 1500;
  913.       if (Player.status[TRUESIGHT] < 1) {
  914.     mprint("You feel less keen now.");
  915.     Player.status[TRUESIGHT] = 0;
  916.       }
  917.     }
  918.     else {
  919.       Player.status[BLINDED] -= 1500;
  920.       if (Player.status[BLINDED] < 1) {
  921.     mprint("You can see again!"); 
  922.     Player.status[BLINDED] = 0;
  923.       }
  924.     }
  925.   } 
  926. }
  927.  
  928. void i_illuminate(o)
  929. pob o;
  930. {
  931.   o->known = 1;
  932.   Objects[o->id].known = 1;
  933.   illuminate(o->blessing);
  934. }
  935.  
  936. void i_perm_illuminate(o)
  937. pob o;
  938. {
  939.   o->known = 1;
  940.   Objects[o->id].known = 1;
  941.   if (o->used) 
  942.     Player.status[ILLUMINATION]+=1500;
  943.   else
  944.     Player.status[ILLUMINATION]=max(0,Player.status[ILLUMINATION]-1500);
  945. }
  946.  
  947.  
  948.  
  949.  
  950. void i_trap(o)
  951. pob o;
  952. {
  953.   Objects[o->id].known = 1;
  954.   
  955.   if ((Level->site[Player.x][Player.y].locchar != FLOOR) ||
  956.       (Level->site[Player.x][Player.y].p_locf != L_NO_OP))
  957.     mprint("Your attempt fails.");
  958.   else  if (! o->known) {
  959.     mprint("Fiddling with the thing, you have a small accident....");
  960.     p_movefunction(o->aux);
  961.   }
  962.   else {
  963.     mprint("You successfully set a trap at your location.");
  964.     Level->site[Player.x][Player.y].p_locf = o->aux;
  965.     lset(Player.x, Player.y, CHANGED);
  966.   }
  967.   dispose_lost_objects(1,o);
  968. }
  969.  
  970.  
  971. void i_raise_portcullis(o)
  972. pob o;
  973. {
  974.   l_raise_portcullis();
  975.   mprint("The box beeps once and explodes in your hands!");
  976.   conform_lost_objects(1,o);
  977. }
  978.  
  979.